# scripts/verify_result.py
import numpy as np
import argparse

def compute_gelu_ref(input_data):
    """计算GELU的参考结果"""
    return 0.5 * input_data * (1 + np.tanh(np.sqrt(2/np.pi) * (input_data + 0.044715 * input_data**3)))

def main():
    # 解析命令行参数
    parser = argparse.ArgumentParser(description='验证GELU算子结果')
    parser.add_argument('--input', type=str, default='input.bin', help='输入数据文件路径')
    parser.add_argument('--output', type=str, default='output.bin', help='算子输出文件路径')
    parser.add_argument('--atol', type=float, default=1e-4, help='绝对误差容忍度')
    parser.add_argument('--rtol', type=float, default=1e-4, help='相对误差容忍度')
    args = parser.parse_args()

    try:
        # 读取二进制数据
        input_data = np.fromfile(args.input, dtype=np.float32)
        actual_output = np.fromfile(args.output, dtype=np.float32)

        # 检查数据长度一致性
        if len(input_data) != len(actual_output):
            raise ValueError(f"数据长度不匹配: 输入长度={len(input_data)}, 输出长度={len(actual_output)}")

        # 计算参考结果
        expected_output = compute_gelu_ref(input_data)

        # 结果比对
        absolute_diff = np.abs(actual_output - expected_output)
        max_abs_diff = np.max(absolute_diff)
        relative_diff = absolute_diff / (np.abs(expected_output) + 1e-9)
        max_rel_diff = np.max(relative_diff)

        # 统计信息
        print("===== 验证结果统计 =====")
        print(f"样本总数: {len(input_data)}")
        print(f"最大绝对误差: {max_abs_diff:.2e}")
        print(f"最大相对误差: {max_rel_diff:.2e}")
        print(f"平均绝对误差: {np.mean(absolute_diff):.2e}")
        print(f"误差容忍度: atol={args.atol}, rtol={args.rtol}")

        # 验证精度
        if np.allclose(actual_output, expected_output, atol=args.atol, rtol=args.rtol):
            print("✅ 验证通过：结果在误差允许范围内")
            return 0
        else:
            print("❌ 验证失败：发现超出误差范围的结果")
            print("\n错误样本示例：")
            error_indices = np.where(absolute_diff > args.atol)[0]
            for i in error_indices[:3]:  # 显示前3个错误样本
                print(f"索引 {i}: 输入={input_data[i]:.4f}")
                print(f"  预期值={expected_output[i]:.6f}")
                print(f"  实际值={actual_output[i]:.6f}")
                print(f"  绝对差={absolute_diff[i]:.2e}, 相对差={relative_diff[i]:.2e}")
            return 1

    except FileNotFoundError as e:
        print(f"文件未找到错误: {e}")
        return 2
    except Exception as e:
        print(f"验证过程中发生异常: {str(e)}")
        return 3

if __name__ == "__main__":
    import sys
    sys.exit(main())